suppressPackageStartupMessages(library(tidyverse))
library(gapminder)

Saving Graphs to File

ggplot(mtcars, aes(hp, wt)) + 
    geom_point()
ggsave(FILENAME_HERE, PLOT_OBJECT_HERE)

Scales; Colour

Scale functions in ggplot2 take the form scale_[aesthetic]_[mapping]().

Let’s first focus on the following plot:

p_scales <- ggplot(gapminder, aes(gdpPercap, lifeExp)) +
     geom_point(aes(colour=pop), alpha=0.2)
p_scales + 
    scale_x_log10() +
    scale_colour_continuous(trans="log10")

  1. Change the y-axis tick mark spacing to 10; change the colour spacing to include all powers of 10.
p_scales +
    scale_x_log10() +
    scale_colour_continuous(
        trans  = "log10", 
        breaks = FILL_IN_BREAKS
    ) +
    FILL_IN_SCALE_FUNCTION(breaks=FILL_IN_BREAKS)
  1. Specify scales::*_format in the labels argument of a scale function to do the following:
    • Change the x-axis labels to dollar format (use scales::dollar_format())
    • Change the colour labels to comma format (use scales::comma_format())
library(scales)

Attaching package: ‘scales’

The following object is masked from ‘package:purrr’:

    discard

The following object is masked from ‘package:readr’:

    col_factor
p_scales +
    scale_x_log10(labels=dollar_format()) +
    scale_colour_continuous(
        trans  = "log10", 
        breaks = 10^(1:10),
        labels = comma_format()
    ) +
    scale_y_continuous(breaks=10*(1:10))

  1. Use RColorBrewer to change the colour scheme.
    • Notice the three different types of scales: sequential, diverging, and continuous.
## All palettes the come with RColorBrewer:
RColorBrewer::display.brewer.all()

p_scales +
    scale_x_log10(labels=dollar_format()) +
  scale_color_distiller(
        trans   = "log10",
        breaks  = 10^(1:10),
        labels  = comma_format(),
        palette = "Greens"
    ) +
    scale_y_continuous(breaks=10*(1:10))

  1. Use viridis to change the colour to a colour-blind friendly scheme
    • Hint: add scale_colour_viridis_c (c stands for continuous; d discrete).
    • You can choose a palette with option.
p_scales +
    scale_x_log10(labels=dollar_format()) +
    scale_colour_viridis_c(
        trans   = "log10",
        breaks  = 10^(1:10),
        labels  = comma_format()
    ) +
    scale_y_continuous(breaks=10*(1:10))

Theming

Changing the look of a graphic can be achieved through the theme() layer.

There are “complete themes” that come with ggplot2, my favourite being theme_bw (I’ve grown tired of the default gray background, so theme_bw is refreshing).

  1. Change the theme of the following plot to theme_bw():
ggplot(iris, aes(Sepal.Width, Sepal.Length)) +
     facet_wrap(~ Species) +
     geom_point() +
     labs(x = "Sepal Width",
          y = "Sepal Length",
          title = "Sepal sizes of three plant species") +
  theme_bw()

  1. Then, change font size of axis labels, and the strip background colour. Others?

Plotly

Consider the following plot:

(p <- gapminder %>% 
     filter(continent != "Oceania") %>% 
     ggplot(aes(gdpPercap, lifeExp)) +
     geom_point(aes(colour=pop), alpha=0.2) +
     scale_x_log10(labels=dollar_format()) +
     scale_colour_distiller(
         trans   = "log10",
         breaks  = 10^(1:10),
         labels  = comma_format(),
         palette = "Greens"
     ) +
     facet_wrap(~ continent) +
     scale_y_continuous(breaks=10*(1:10)) +
     theme_bw())

  1. Convert it to a plotly object by applying the ggplotly() function:
library(plotly)
Loading required package: ggplot2

Attaching package: ‘plotly’

The following object is masked from ‘package:ggplot2’:

    last_plot

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout
ggplotly (p)
  1. You can save a plotly graph locally as an html file. Try saving the above:
    • NOTE: plotly graphs don’t seem to show up in Rmd notebooks, but they do with Rmd documents.
p %>% 
    ggplotly() %>% 
    htmlwidgets::saveWidget("LOCATION_GOES_HERE")
  1. Run this code to see the json format underneath:
p %>% 
    ggplotly() %>% 
    plotly_json()
Error: Package `listviewer` required for `plotly_json`.
Please install and try again.
  1. Check out code to make a plotly object from scratch using plot_ly() – scatterplot of gdpPercap vs lifeExp.
plot_ly(gapminder, 
        x = ~gdpPercap, 
        y = ~lifeExp, 
        type = "scatter",
        mode = "markers",
        opacity = 0.2) %>% 
    layout(xaxis = list(type = "log"))
  1. Add population to form a z-axis for a 3D plot:
plot_ly(gapminder, 
        x = ~gdpPercap, 
        y = ~lifeExp, 
        z = ~pop,
        type = "scatter3d",
        mode = "markers",
        opacity = 0.2)
LS0tCnRpdGxlOiAiY20wMTMgRXhlcmNpc2UiCm91dHB1dDogaHRtbF9ub3RlYm9vawplZGl0b3Jfb3B0aW9uczogCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQotLS0KCmBgYHtyfQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMobGlicmFyeSh0aWR5dmVyc2UpKQpsaWJyYXJ5KGdhcG1pbmRlcikKYGBgCgoKIyBTYXZpbmcgR3JhcGhzIHRvIEZpbGUKCi0gRG9uJ3QgdXNlIHRoZSBtb3VzZQotIFVzZSBgZ2dzYXZlYCBmb3IgZ2dwbG90CiAgICAtIFByYWN0aWNlIGJ5IHNhdmluZyB0aGUgZm9sbG93aW5nIHBsb3QgdG8gZmlsZTogCgpgYGB7cn0KZ2dwbG90KG10Y2FycywgYWVzKGhwLCB3dCkpICsgCiAgICBnZW9tX3BvaW50KCkKZ2dzYXZlKEZJTEVOQU1FX0hFUkUsIFBMT1RfT0JKRUNUX0hFUkUpCmBgYAoKLSBCYXNlIFIgd2F5OiBwcmludCBwbG90cyAidG8gc2NyZWVuIiwgc2FuZHdpY2hlZCBiZXR3ZWVuIGBwZGYoKWAvYGpwZWcoKWAvYHBuZygpYC4uLiBhbmQgYGRldi5vZmYoKWAuIAotIFZlY3RvciB2cy4gcmFzdGVyOiBJbWFnZXMgYXJlIHN0b3JlZCBvbiB5b3VyIGNvbXB1dGVyIGFzIGVpdGhlciBfdmVjdG9yXyBvciBfcmFzdGVyXy4KICAgIC0gX19SYXN0ZXJfXzogYW4gYG5gIGJ5IGBtYCBncmlkIG9mIHBpeGVscywgZWFjaCB3aXRoIGl0cyBvd24gY29sb3VyLiBganBlZ2AsIGBwbmdgLCBgZ2lmYCwgYGJtcGAuCiAgICAtIF9fVmVjdG9yX186IHJlcHJlc2VudGVkIGFzIHNoYXBlcyBhbmQgbGluZXMuIGBwZGZgLCBbYHN2Z2BdKGh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vZ3JhcGhpY3Mvc3ZnX2ludHJvLmFzcCkuCiAgICAtIEZvciB0aXBzOiBbIjEwIHRpcHMgZm9yIG1ha2luZyB5b3VyIFIgZ3JhcGhpY3MgbG9vayB0aGVpciBiZXN0IiJdKGh0dHA6Ly9ibG9nLnJldm9sdXRpb25hbmFseXRpY3MuY29tLzIwMDkvMDEvMTAtdGlwcy1mb3ItbWFraW5nLXlvdXItci1ncmFwaGljcy1sb29rLXRoZWlyLWJlc3QuaHRtbCkuCiAgICAKIyBTY2FsZXM7IENvbG91cgoKU2NhbGUgZnVuY3Rpb25zIGluIGBnZ3Bsb3QyYCB0YWtlIHRoZSBmb3JtIGBzY2FsZV9bYWVzdGhldGljXV9bbWFwcGluZ10oKWAuCgpMZXQncyBmaXJzdCBmb2N1cyBvbiB0aGUgZm9sbG93aW5nIHBsb3Q6CgpgYGB7cn0KcF9zY2FsZXMgPC0gZ2dwbG90KGdhcG1pbmRlciwgYWVzKGdkcFBlcmNhcCwgbGlmZUV4cCkpICsKICAgICBnZW9tX3BvaW50KGFlcyhjb2xvdXI9cG9wKSwgYWxwaGE9MC4yKQpwX3NjYWxlcyArIAogICAgc2NhbGVfeF9sb2cxMCgpICsKICAgIHNjYWxlX2NvbG91cl9jb250aW51b3VzKHRyYW5zPSJsb2cxMCIpCmBgYAoKMS4gQ2hhbmdlIHRoZSB5LWF4aXMgdGljayBtYXJrIHNwYWNpbmcgdG8gMTA7IGNoYW5nZSB0aGUgY29sb3VyIHNwYWNpbmcgdG8gaW5jbHVkZSBhbGwgcG93ZXJzIG9mIDEwLgoKYGBge3J9CnBfc2NhbGVzICsKICAgIHNjYWxlX3hfbG9nMTAoKSArCiAgICBzY2FsZV9jb2xvdXJfY29udGludW91cygKICAgICAgICB0cmFucyAgPSAibG9nMTAiLCAKICAgICAgICBicmVha3MgPSBGSUxMX0lOX0JSRUFLUwogICAgKSArCiAgICBGSUxMX0lOX1NDQUxFX0ZVTkNUSU9OKGJyZWFrcz1GSUxMX0lOX0JSRUFLUykKYGBgCgoyLiBTcGVjaWZ5IGBzY2FsZXM6OipfZm9ybWF0YCBpbiB0aGUgYGxhYmVsc2AgYXJndW1lbnQgb2YgYSBzY2FsZSBmdW5jdGlvbiB0byBkbyB0aGUgZm9sbG93aW5nOgogICAgLSBDaGFuZ2UgdGhlIHgtYXhpcyBsYWJlbHMgdG8gZG9sbGFyIGZvcm1hdCAodXNlIGBzY2FsZXM6OmRvbGxhcl9mb3JtYXQoKWApCiAgICAtIENoYW5nZSB0aGUgY29sb3VyIGxhYmVscyB0byBjb21tYSBmb3JtYXQgKHVzZSBgc2NhbGVzOjpjb21tYV9mb3JtYXQoKWApCgpgYGB7cn0KbGlicmFyeShzY2FsZXMpCnBfc2NhbGVzICsKICAgIHNjYWxlX3hfbG9nMTAobGFiZWxzPWRvbGxhcl9mb3JtYXQoKSkgKwogICAgc2NhbGVfY29sb3VyX2NvbnRpbnVvdXMoCiAgICAgICAgdHJhbnMgID0gImxvZzEwIiwgCiAgICAgICAgYnJlYWtzID0gMTBeKDE6MTApLAogICAgICAgIGxhYmVscyA9IGNvbW1hX2Zvcm1hdCgpCiAgICApICsKICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3M9MTAqKDE6MTApKQpgYGAKCjMuIFVzZSBgUkNvbG9yQnJld2VyYCB0byBjaGFuZ2UgdGhlIGNvbG91ciBzY2hlbWUuCiAgICAtIE5vdGljZSB0aGUgdGhyZWUgZGlmZmVyZW50IHR5cGVzIG9mIHNjYWxlczogc2VxdWVudGlhbCwgZGl2ZXJnaW5nLCBhbmQgY29udGludW91cy4KCmBgYHtyfQojIyBBbGwgcGFsZXR0ZXMgdGhlIGNvbWUgd2l0aCBSQ29sb3JCcmV3ZXI6ClJDb2xvckJyZXdlcjo6ZGlzcGxheS5icmV3ZXIuYWxsKCkKcF9zY2FsZXMgKwogICAgc2NhbGVfeF9sb2cxMChsYWJlbHM9ZG9sbGFyX2Zvcm1hdCgpKSArCiAgc2NhbGVfY29sb3JfZGlzdGlsbGVyKAogICAgICAgIHRyYW5zICAgPSAibG9nMTAiLAogICAgICAgIGJyZWFrcyAgPSAxMF4oMToxMCksCiAgICAgICAgbGFiZWxzICA9IGNvbW1hX2Zvcm1hdCgpLAogICAgICAgIHBhbGV0dGUgPSAiR3JlZW5zIgogICAgKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPTEwKigxOjEwKSkKYGBgCgo0LiBVc2UgYHZpcmlkaXNgIHRvIGNoYW5nZSB0aGUgY29sb3VyIHRvIGEgY29sb3VyLWJsaW5kIGZyaWVuZGx5IHNjaGVtZQogICAgLSBIaW50OiBhZGQgYHNjYWxlX2NvbG91cl92aXJpZGlzX2NgIChgY2Agc3RhbmRzIGZvciBjb250aW51b3VzOyBgZGAgZGlzY3JldGUpLgogICAgLSBZb3UgY2FuIGNob29zZSBhIHBhbGV0dGUgd2l0aCBgb3B0aW9uYC4KCmBgYHtyfQpwX3NjYWxlcyArCiAgICBzY2FsZV94X2xvZzEwKGxhYmVscz1kb2xsYXJfZm9ybWF0KCkpICsKICAgIHNjYWxlX2NvbG91cl92aXJpZGlzX2MoCiAgICAgICAgdHJhbnMgICA9ICJsb2cxMCIsCiAgICAgICAgYnJlYWtzICA9IDEwXigxOjEwKSwKICAgICAgICBsYWJlbHMgID0gY29tbWFfZm9ybWF0KCkKICAgICkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz0xMCooMToxMCkpCmBgYAoKIyBUaGVtaW5nCgpDaGFuZ2luZyB0aGUgbG9vayBvZiBhIGdyYXBoaWMgY2FuIGJlIGFjaGlldmVkIHRocm91Z2ggdGhlIGB0aGVtZSgpYCBsYXllci4KClRoZXJlIGFyZSBbImNvbXBsZXRlIHRoZW1lcyJdKGh0dHA6Ly9nZ3Bsb3QyLnRpZHl2ZXJzZS5vcmcvcmVmZXJlbmNlL2dndGhlbWUuaHRtbCkgdGhhdCBjb21lIHdpdGggYGdncGxvdDJgLCBteSBmYXZvdXJpdGUgYmVpbmcgYHRoZW1lX2J3YCAoSSd2ZSBncm93biB0aXJlZCBvZiB0aGUgZGVmYXVsdCBncmF5IGJhY2tncm91bmQsIHNvIGB0aGVtZV9id2AgaXMgcmVmcmVzaGluZykuCgoxLiBDaGFuZ2UgdGhlIHRoZW1lIG9mIHRoZSBmb2xsb3dpbmcgcGxvdCB0byBgdGhlbWVfYncoKWA6CgpgYGB7cn0KZ2dwbG90KGlyaXMsIGFlcyhTZXBhbC5XaWR0aCwgU2VwYWwuTGVuZ3RoKSkgKwogICAgIGZhY2V0X3dyYXAofiBTcGVjaWVzKSArCiAgICAgZ2VvbV9wb2ludCgpICsKICAgICBsYWJzKHggPSAiU2VwYWwgV2lkdGgiLAogICAgICAgICAgeSA9ICJTZXBhbCBMZW5ndGgiLAogICAgICAgICAgdGl0bGUgPSAiU2VwYWwgc2l6ZXMgb2YgdGhyZWUgcGxhbnQgc3BlY2llcyIpICsKICB0aGVtZV9idygpCmBgYAoKMi4gVGhlbiwgY2hhbmdlIGZvbnQgc2l6ZSBvZiBheGlzIGxhYmVscywgYW5kIHRoZSBzdHJpcCBiYWNrZ3JvdW5kIGNvbG91ci4gT3RoZXJzPwoKYGBge3J9CmdncGxvdChpcmlzLCBhZXMoU2VwYWwuV2lkdGgsIFNlcGFsLkxlbmd0aCkpICsKICAgICBmYWNldF93cmFwKH4gU3BlY2llcykgKwogICAgIGdlb21fcG9pbnQoKSArCiAgICAgbGFicyh4ID0gIlNlcGFsIFdpZHRoIiwKICAgICAgICAgIHkgPSAiU2VwYWwgTGVuZ3RoIiwKICAgICAgICAgIHRpdGxlID0gIlNlcGFsIHNpemVzIG9mIHRocmVlIHBsYW50IHNwZWNpZXMiKSArCiAgICB0aGVtZV9idygpICsKICAgIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIm9yYW5nZSIpLCAKICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJibHVlIikpCmBgYAoKCiMgUGxvdGx5CgpDb25zaWRlciB0aGUgZm9sbG93aW5nIHBsb3Q6CgpgYGB7cn0KKHAgPC0gZ2FwbWluZGVyICU+JSAKICAgICBmaWx0ZXIoY29udGluZW50ICE9ICJPY2VhbmlhIikgJT4lIAogICAgIGdncGxvdChhZXMoZ2RwUGVyY2FwLCBsaWZlRXhwKSkgKwogICAgIGdlb21fcG9pbnQoYWVzKGNvbG91cj1wb3ApLCBhbHBoYT0wLjIpICsKICAgICBzY2FsZV94X2xvZzEwKGxhYmVscz1kb2xsYXJfZm9ybWF0KCkpICsKICAgICBzY2FsZV9jb2xvdXJfZGlzdGlsbGVyKAogICAgICAgICB0cmFucyAgID0gImxvZzEwIiwKICAgICAgICAgYnJlYWtzICA9IDEwXigxOjEwKSwKICAgICAgICAgbGFiZWxzICA9IGNvbW1hX2Zvcm1hdCgpLAogICAgICAgICBwYWxldHRlID0gIkdyZWVucyIKICAgICApICsKICAgICBmYWNldF93cmFwKH4gY29udGluZW50KSArCiAgICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz0xMCooMToxMCkpICsKICAgICB0aGVtZV9idygpKQpgYGAKCjEuIENvbnZlcnQgaXQgdG8gYSBgcGxvdGx5YCBvYmplY3QgYnkgYXBwbHlpbmcgdGhlIGBnZ3Bsb3RseSgpYCBmdW5jdGlvbjoKCmBgYHtyfQpsaWJyYXJ5KHBsb3RseSkKZ2dwbG90bHkgKHApCmBgYAoKMi4gWW91IGNhbiBzYXZlIGEgcGxvdGx5IGdyYXBoIGxvY2FsbHkgYXMgYW4gaHRtbCBmaWxlLiBUcnkgc2F2aW5nIHRoZSBhYm92ZToKICAgIC0gTk9URTogcGxvdGx5IGdyYXBocyBkb24ndCBzZWVtIHRvIHNob3cgdXAgaW4gUm1kIF9ub3RlYm9va3NfLCBidXQgdGhleSBkbyB3aXRoIFJtZCBfZG9jdW1lbnRzXy4KCmBgYHtyfQpwICU+JSAKICAgIGdncGxvdGx5KCkgJT4lIAogICAgaHRtbHdpZGdldHM6OnNhdmVXaWRnZXQoIkxPQ0FUSU9OX0dPRVNfSEVSRSIpCmBgYAoKCjMuIFJ1biB0aGlzIGNvZGUgdG8gc2VlIHRoZSBqc29uIGZvcm1hdCB1bmRlcm5lYXRoOgoKYGBge3J9CnAgJT4lIAogICAgZ2dwbG90bHkoKSAlPiUgCiAgICBwbG90bHlfanNvbigpCmBgYAoKCjQuIENoZWNrIG91dCBjb2RlIHRvIG1ha2UgYSBwbG90bHkgb2JqZWN0IGZyb20gc2NyYXRjaCB1c2luZyBgcGxvdF9seSgpYCAtLSBzY2F0dGVycGxvdCBvZiBnZHBQZXJjYXAgdnMgbGlmZUV4cC4KICAgIC0gQ2hlY2sgb3V0IHRoZSBbY2hlYXQgc2hlZXRdKGh0dHBzOi8vaW1hZ2VzLnBsb3QubHkvcGxvdGx5LWRvY3VtZW50YXRpb24vaW1hZ2VzL3JfY2hlYXRfc2hlZXQucGRmKS4KCmBgYHtyfQpwbG90X2x5KGdhcG1pbmRlciwgCiAgICAgICAgeCA9IH5nZHBQZXJjYXAsIAogICAgICAgIHkgPSB+bGlmZUV4cCwgCiAgICAgICAgdHlwZSA9ICJzY2F0dGVyIiwKICAgICAgICBtb2RlID0gIm1hcmtlcnMiLAogICAgICAgIG9wYWNpdHkgPSAwLjIpICU+JSAKICAgIGxheW91dCh4YXhpcyA9IGxpc3QodHlwZSA9ICJsb2ciKSkKYGBgCgo1LiBBZGQgcG9wdWxhdGlvbiB0byBmb3JtIGEgei1heGlzIGZvciBhIDNEIHBsb3Q6CgpgYGB7cn0KcGxvdF9seShnYXBtaW5kZXIsIAogICAgICAgIHggPSB+Z2RwUGVyY2FwLCAKICAgICAgICB5ID0gfmxpZmVFeHAsIAogICAgICAgIHogPSB+cG9wLAogICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICBtb2RlID0gIm1hcmtlcnMiLAogICAgICAgIG9wYWNpdHkgPSAwLjIpCmBgYAoKCg==